/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.isd.seguridad.web;


import com.isd.global.modelo.CorreoElectronico;
import com.isd.global.modelo.Parametro;
import com.isd.global.rn.ParametrosRN;
import com.isd.global.util.JsfUtil;
import com.isd.global.web.MailFactory;
import com.isd.seguridad.modelo.Usuario;
import com.isd.seguridad.rn.UsuarioRN;
import com.isd.venta.modelo.Cliente;
import com.isd.ventas.rn.ClienteRN;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.mail.internet.InternetAddress;

/**
 *
 * @author ctrosch
 */
@ManagedBean
@ViewScoped
public class SeguridadUsuarioBean {

    @EJB private UsuarioRN usuarioRN;
    @EJB private ClienteRN clienteRN;
    @EJB private ParametrosRN parametroRN;
    @EJB private MailFactory mailFactory;

    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean usuarioSessionBean;

    //Datos para recuperar contraseña
    private String rCUIT;    
    private Usuario usuario;
    private Cliente cliente;
    private Parametro p;
    private String rCampoPassword;


    /** Creates a new instance of SeguridadUsuarioBean */
    public SeguridadUsuarioBean() {

        rCUIT = "";
    }

    @PostConstruct
    private void init(){
       
        try {
            p = parametroRN.getParametros();
        } catch (Exception ex) {

        }

        if(usuarioSessionBean.getUsuario()!=null){
            usuario = usuarioSessionBean.getUsuario();

            if(usuario.getCliente()!=null){
                cliente = usuario.getCliente();
            }
        }

    }

    public String recuperarPassword(){

        if(rCUIT.isEmpty()){
            JsfUtil.addErrorMessage("Ingrese por favor un número CUIT válido y sin guiones");
            return "";            
        }

        Map<String,String> filtro = new HashMap<String,String>();
        filtro.put("nrodoc = ", "'"+rCUIT+"'");
        List<Cliente> lista = clienteRN.getClientes(filtro);

        if(lista.size()>1){
            informeCorreoDuplicado();
        }

        if(lista.isEmpty()){
            JsfUtil.addErrorMessage("La cuit ingresada no corresponde a un cliente de Intercap S.R.L.");
            return "";
        }
        
        //Asignamos el cliente
        cliente = lista.get(0);
        
        if(cliente!=null){
            
            //Recuperamos usuario del cliente
            usuario = usuarioRN.getUsuarioByNroCuenta(cliente.getNrocta());

            if(usuario==null){
                JsfUtil.addInfoMessage("La CUIT ingresada no tiene asociado un usuario válido");
                JsfUtil.addInfoMessage("En breve nuestro S.A.I. se pondrá en contacto con usted. Muchas gracias");
                informeClienteSinUsuario();
                return "";
            }

            if(cliente.getDireml()==null){
                JsfUtil.addInfoMessage("La CUIT ingresada no tiene asociada una cuenta de correo");
                JsfUtil.addInfoMessage("En breve nuestro S.A.I. se pondrá en contacto con usted. Muchas gracias");
                informeClienteSinCorreo();
                return "";
            }

            if(cliente.getDireml().isEmpty()){
                JsfUtil.addInfoMessage("La CUIT ingresada no tiene asociada una cuenta de correo ");
                JsfUtil.addInfoMessage("En breve nuestro S.A.I. se pondrá en contacto con usted. Muchas gracias");
                informeClienteSinCorreo();
                return "";
            }
            
            //Si todo está bien comienza el proceso recupero de clave
            renovarClave();
            //Enviamos los emails
            informeSolicitudDatosCliente();
            informeSolicitudDatosEmpresa();
        }

        return "../seguridad/login.xhtml";
    }

    public void informeSolicitudDatosCliente(){

        List<String> parrafos = new ArrayList<String>();
        parrafos.add("Estimado cliente:");
        parrafos.add("De acuerdo a su solicitud, hemos generado una clave de acceso.");
        parrafos.add("Sus datos de acceso:");
        parrafos.add("Nombre de usuario: "+usuario.getNombre());
        parrafos.add("Nueva clave: "+usuario.getPassword());
        parrafos.add("");
        parrafos.add("En su próximo ingreso podrá cambiar la clave ");        
        parrafos.add("");       
                
        CorreoElectronico  ce = new CorreoElectronico(
                "Solicitud de clave Tienda Virtual", 
                cliente.getDireml(),
                mailFactory.generarMensaje("Cambio de clave",parrafos));
                
        if(mailFactory.enviarCorreoElectronico(ce)){
            JsfUtil.addInfoMessage("Se ha enviado un correo electrónico a la casilla de correo asociada a la cuit ingresada","");
        }else{
            JsfUtil.addWarningMessage("Disculpe las molestias, actualmente no podemos procesar su solicitud","");
        }       

    }

    private void informeModificacionDatosCliente() {

        List<String> parrafos = new ArrayList<String>();
        parrafos.add("Estimado cliente:");
        parrafos.add("Su clave ha sido modificada correctamente");
        parrafos.add("");
        parrafos.add("Sus datos de acceso:");
        parrafos.add("Nombre de usuario: "+usuario.getNombre());
        parrafos.add("Nueva clave: "+usuario.getPassword());
        parrafos.add("");
        
        CorreoElectronico ce = new CorreoElectronico();
        ce.setAsunto("Nueva de clave Tienda Virtual");
        ce.setDestinatarios(cliente.getDireml());
        ce.setContenido(mailFactory.generarMensaje("Cambio de clave",parrafos));
        
        if(!mailFactory.enviarCorreoElectronico(ce)){
            JsfUtil.addWarningMessage("Disculpe las molestias, actualmente no podemos procesar su solicitud","");
        }
    }

    public void informeSolicitudDatosEmpresa() {
        try {

            String asunto  = "("+cliente.getNrocta()+")"+ cliente.getNombre() + "ha solicitado datos de acceso ";
            String mensaje = "El cliente: ("+cliente.getNrocta()+")"+cliente.getNombre()+" \n";
            mensaje += "Ha solicitado los datos de acceso a la tienda vitual\n";

            InternetAddress dirFrom = null;

            if(cliente.getDireml()!=null){
                if(!cliente.getDireml().isEmpty()){

                    dirFrom = new InternetAddress(cliente.getDireml() , cliente.getNombre());
                }
            }

            CorreoElectronico ce = new CorreoElectronico();
            ce.setDirFrom(dirFrom);
            ce.setAsunto(asunto);
            ce.setDestinatarios(p.getEmailRecepcionConsulta());
            ce.setContenido(mensaje);
            
            //Enviamos el correo
            mailFactory.enviarCorreoElectronico(ce);
            
        } catch (Exception e) {

            JsfUtil.addErrorMessage(e.getMessage());
        }
    }

    public void informeClienteSinUsuario(){

        try {

            String asunto  = "Cliente ("+cliente.getNrocta()+")"+ cliente.getNombre() + " solicita usuario en la tienda virtual ";
            String mensaje = "El cliente: ("+cliente.getNrocta()+")"+cliente.getNombre()+" \n";
            mensaje += "Ha solicitado que se le genere los datos de acceso a la tienda vitual\n";
            mensaje += "Favor de generar los datos solicitado e informar al cliente\n";

            InternetAddress dirFrom = null;

            if(cliente.getDireml()!=null){
                if(!cliente.getDireml().isEmpty()){

                    dirFrom = new InternetAddress(cliente.getDireml() , cliente.getNombre());
                }
            }
            
            CorreoElectronico ce = new CorreoElectronico();
            ce.setDirFrom(dirFrom);
            ce.setAsunto(asunto);
            ce.setDestinatarios(p.getEmailRecepcionConsulta());
            ce.setContenido(mensaje);
            
            //Enviamos el correo
            mailFactory.enviarCorreoElectronico(ce);  

        } catch (Exception e) {

            JsfUtil.addErrorMessage(e.getMessage());
        }
    }

    public void informeClienteSinCorreo(){

        try {

            String asunto  = "Cliente ("+cliente.getNrocta()+")"+ cliente.getNombre() + " sin correo electrónico ";
            String mensaje = "El cliente: ("+cliente.getNrocta()+")"+cliente.getNombre()+" \n";
            mensaje += "Ha solicitado los datos de acceso a la tienda virtual, pero no tiene asociado ninguna cuenta de correo\n";
            mensaje += "Favor de ponerse en contacto con el cliente para actualizar los datos\n";

            CorreoElectronico ce = new CorreoElectronico(asunto, p.getEmailRecepcionConsulta(), mensaje);                        
            mailFactory.enviarCorreoElectronico(ce);  
            
        } catch (Exception e) {

            JsfUtil.addErrorMessage(e.getMessage());
        }
    }

    public void informeCorreoDuplicado(){

        try {

            String asunto  = "Correos duplicados ";
            String mensaje = "Los clientes: \n"
                    + " ("+cliente.getNrocta()+")"+cliente.getNombre()+" \n"
                    + " ("+cliente.getNrocta()+")"+cliente.getNombre()+" \n"
                    + "Tiene correos duplicados, verificar por favor los datos y ponerse en contacto con el cliente";

           InternetAddress dirFrom = null;

           if(cliente.getDireml()!=null){
               if(!cliente.getDireml().isEmpty()){
                   dirFrom = new InternetAddress(cliente.getDireml() , cliente.getNombre());
               }
           }

            CorreoElectronico ce = new CorreoElectronico(dirFrom,asunto, p.getEmailRecepcionConsulta(), mensaje);                        
            mailFactory.enviarCorreoElectronico(ce);  
            
        } catch (Exception e) {

            JsfUtil.addErrorMessage(e.getMessage());
        }
    }

    public void cambiarPassword(){

        try {
            if (rCampoPassword.equals(usuario.getPassword())) {
                usuario.setCambiaPassword('N');
                usuarioRN.guardar(usuario);
                JsfUtil.addInfoMessage("Muchas gracias!. Su clave ha sido modificado satisfactoriamento. Haga click en \"Finalizar\" para continuar");
                informeModificacionDatosCliente();
            } else {
                usuario.setPassword("");
                rCampoPassword = "";
                JsfUtil.addErrorMessage("Los datos ingresados no coinciden, ingrese nuevamente su clave");
            }
        } catch (Exception e) {

            JsfUtil.addErrorMessage("No es posible cambiar el password en este momento, error interno");
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "cambiarPassword", e);           
        }
    }

    private void renovarClave() {

        try {
            String nuevaClave = JsfUtil.getCadenaAlfanumAleatoria(8);

            usuario.setPassword(nuevaClave);
            usuario.setCambiaPassword('S');
            usuarioRN.guardar(usuario);
        } catch (Exception e) {

            JsfUtil.addErrorMessage("No es posible recuperar su clave en estos momentos");
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "renovarClave", e);           

        }
    }

    public String verCambioPassword(){

        return "../seguridad/cambioPassword.xhtml";
    }


    //_-------------------------------------------------

    public String getrCUIT() {
        return rCUIT;
    }

    public void setrCUIT(String rCUIT) {
        this.rCUIT = rCUIT;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public UsuarioSessionBean getUsuarioSessionBean() {
        return usuarioSessionBean;
    }

    public void setUsuarioSessionBean(UsuarioSessionBean usuarioSessionBean) {
        this.usuarioSessionBean = usuarioSessionBean;
    }

    public String getrCampoPassword() {
        return rCampoPassword;
    }

    public void setrCampoPassword(String rCampoPassword) {
        this.rCampoPassword = rCampoPassword;
    }    
}
